Estadística y Manejo de Datos con R (EMDR) — Virtual

Acomodo de datos

  • Después de obtener los datos podemos conocer su estructura en R.

  • Con head() y tail() podemos conocer la parte superior e inferior del df (marco de datos, por su acrónimo en inglés).

  • Con str() podemos conocer su estructura y el tipo de datos que contiene.

  • Otro aspecto importante es manipular el df para obtener un subconjunto, separar o juntar columnas, deshacerse de casos o celdas vacías, etc.

Acomodo de datos

  • R tiene una nomenclatura de datos no convencionales: NA
  • Equivale a celdas vacías en hojas de cálculo.
x <- c(1, 2, 3, NA) # NA, not avaliable
x
## [1]  1  2  3 NA
sum(x)
## [1] NA

Acomodo de datos

  • Otros datos no convencionales: NaN
  • Son el resultado de ciertas operaciones.
x <- c(1, 2, 3, NaN) # NaN, not a number
x
## [1]   1   2   3 NaN
sum(x)
## [1] NaN
0/0
## [1] NaN

Acomodo de datos

  • Otros datos no convencionales: Inf
  • Son el resultado de ciertas operaciones.
x <- c(1, 2, 3, Inf) # Inf, infinite value
x
## [1]   1   2   3 Inf
sum(x)
## [1] Inf
1/0
## [1] Inf

Acomodo de datos

  • Manipulación mediante caracteres boleanos.
  • El operador boleano para igual es == y para distinto es !=
x <- c(1, 2, 3, NA)
x == "NA"
## [1] FALSE FALSE FALSE    NA
x != "NA"
## [1] TRUE TRUE TRUE   NA

Acomodo de datos

  • Manipulación mediante caracteres boleanos.
  • Una alternativa es la función is.na()
x <- c(1, 2, 3, NA)
is.na(x)
## [1] FALSE FALSE FALSE  TRUE
!is.na(x)
## [1]  TRUE  TRUE  TRUE FALSE
  • Ver también is.finite(), is.nan(), is.vector(), etc.

Acomodo de datos

  • Otros caracteres boleanos:
-2:2
## [1] -2 -1  0  1  2
  • > y < (mayor/menor que)
((-2:2) > 0) 
## [1] FALSE FALSE FALSE  TRUE  TRUE
  • >= y <= (mayor/menor o igual que)
((-2:2) >= 0) 
## [1] FALSE FALSE  TRUE  TRUE  TRUE

Acomodo de datos

  • Otros caracteres boleanos: & (y/and).
((-2:2) >= 0) & ((-2:2) <= 0)
## [1] FALSE FALSE  TRUE FALSE FALSE
  • Otros caracteres boleanos: | (o/or).
((-2:2) >= 0) | ((-2:2) <= 0)
## [1] TRUE TRUE TRUE TRUE TRUE

Acomodo de datos

  • Comparativo de los caracteres boleanos.
Símbolo Operación
x == y equivalencia
x != y diferencia
!x negación lógica
x & y y
x | y o

Acomodo de datos: Ejercicios

  • Utilizando el marco de datos de chickwts, selecciona un subconjunto de datos utilizando operadores lógicos:
    • Los pesos de los pollos que comieron sunflower.
    • Los pesos de todos excepto los que comieron meatmeal.
    • Los pesos mayores de 200, pero menores de 300.

Acomodo de datos: Ejercicios

  • Solución (1era parte)
    • Disponibles después de la fecha de entrega.

Acomodo de datos: Ejercicios

  • Solución (2nda parte)
    • Disponibles después de la fecha de entrega.

Acomodo de datos: subset()

  • Una función que hace subconjuntos de las estructuras según los criterios que proveemos.
data(Animals, package = "MASS")
head(Animals)
##                     body brain
## Mountain beaver     1.35   8.1
## Cow               465.00 423.0
## Grey wolf          36.33 119.5
## Goat               27.66 115.0
## Guinea pig          1.04   5.5
## Dipliodocus     11700.00  50.0

Acomodo de datos: subset()

  • Una función que hace subconjuntos de las estructuras según los criterios que proveemos.
subset(x = Animals, subset = body / brain > 10)
##                body brain
## Dipliodocus   11700  50.0
## Triceratops    9400  70.0
## Brachiosaurus 87000 154.5

Acomodo de datos: aggregate()

  • Colapsa los datos usando ciertos criteros (factores) y calculando una función.
data(Traffic, package = "MASS")
head(Traffic)
##   year day limit  y
## 1 1961   1    no  9
## 2 1961   2    no 11
## 3 1961   3    no  9
## 4 1961   4    no 20
## 5 1961   5    no 31
## 6 1961   6    no 26

Acomodo de datos: aggregate()

  • Colapsa los datos usando ciertos criteros (factores) y calculando una función.
aggregate(formula = y ~ year*limit, data = Traffic, FUN = mean)
##   year limit        y
## 1 1961    no 23.67606
## 2 1962    no 22.25000
## 3 1961   yes 19.66667
## 4 1962   yes 18.58333

Paréntesis: el operador tilde ~

  • El operador tilde ~ describe una relación particular entre dos variables, por ejemplo: x en función de y.
aggregate (x ∼ y)

aggregate() y subset(): Ejercicios

  • Carga airquality
  • Selecciona el subconjunto de valores completos (es decir, sin NA’s) para Ozone, Solar.R, Wind y Month.
    • tip: is.na()
  • Selecciona el subconjunto de Temp mayores de 55.
  • Agrega los valores de Solar.R por mes, para obtener la media y la desviación estándar.

aggregate() y subset(): Ejercicios

  • Soluciones (1era parte)
    • Disponibles después de la fecha de entrega.

aggregate() y subset(): Ejercicios

  • Soluciones (2nda parte)
    • Disponibles después de la fecha de entrega.

Wrangling (arreo) de datos

Acomodo de datos

Acomodo de datos: tidyr

Acomodo de datos: tidyr

  • La filosofia de tidyr es tener una forma estandarizada de acomodar los datos.
    • Cada variable es una columna.
    • Cada observación es una fila.
    • Tenemos un solo un tipo de información en cada celda.
    • Así la información resulta fácil de convertir y graficar.

Acomodo de datos: tidyr

  • Formato largo/longitudinal vs ancho.

Acomodo de datos: tidyr

  • gather() sirve para pasar de formato ancho a formato largo.

Acomodo de datos: tidyr

Acomodo de datos: tidyr

  • Veamos unos datos: ¿qué problema tienen?
library(tidyr)
table4b
## # A tibble: 3 × 3
##   country         `1999`     `2000`
## * <chr>            <int>      <int>
## 1 Afghanistan   19987071   20595360
## 2 Brazil       172006362  174504898
## 3 China       1272915272 1280428583

Acomodo de datos: tidyr

  • Los acomodamos o dejamos tidy (ordenados) con:
tidy.4b <- gather (table4b, key ="year", value="population", -country )
tidy.4b
## # A tibble: 6 × 3
##   country     year  population
##   <chr>       <chr>      <int>
## 1 Afghanistan 1999    19987071
## 2 Brazil      1999   172006362
## 3 China       1999  1272915272
## 4 Afghanistan 2000    20595360
## 5 Brazil      2000   174504898
## 6 China       2000  1280428583

Acomodo de datos: tidyr

  • spread() sirve para pasar de formato largo a formato ancho.

Acomodo de datos: tidyr

Acomodo de datos: tidyr

  • Veamos unos datos: ¿qué problema tienen?
head(table2)
## # A tibble: 6 × 4
##   country      year type           count
##   <chr>       <int> <chr>          <int>
## 1 Afghanistan  1999 cases            745
## 2 Afghanistan  1999 population  19987071
## 3 Afghanistan  2000 cases           2666
## 4 Afghanistan  2000 population  20595360
## 5 Brazil       1999 cases          37737
## 6 Brazil       1999 population 172006362

Acomodo de datos: tidyr

  • Los acomodamos o dejamos tidy (ordenados) con:
tidy.2 <- spread(table2, type, count)
tidy.2
## # A tibble: 6 × 4
##   country      year  cases population
##   <chr>       <int>  <int>      <int>
## 1 Afghanistan  1999    745   19987071
## 2 Afghanistan  2000   2666   20595360
## 3 Brazil       1999  37737  172006362
## 4 Brazil       2000  80488  174504898
## 5 China        1999 212258 1272915272
## 6 China        2000 213766 1280428583

Acomodo de datos: tidyr

  • Y de largo a ancho y viceversa.

Acomodo de datos: tidyr

  • separate() divide variables complejas en variables individuales.

Acomodo de datos: tidyr

Acomodo de datos: tidyr

  • Veamos unos datos: ¿qué problema tienen?
head(table3)
## # A tibble: 6 × 3
##   country      year rate             
##   <chr>       <int> <chr>            
## 1 Afghanistan  1999 745/19987071     
## 2 Afghanistan  2000 2666/20595360    
## 3 Brazil       1999 37737/172006362  
## 4 Brazil       2000 80488/174504898  
## 5 China        1999 212258/1272915272
## 6 China        2000 213766/1280428583

Acomodo de datos: tidyr

  • Los acomodamos o dejamos tidy (ordenados) con:
tidy.3 <- separate(table3, rate, c("cases", "population"), sep = "/")
tidy.3
## # A tibble: 6 × 4
##   country      year cases  population
##   <chr>       <int> <chr>  <chr>     
## 1 Afghanistan  1999 745    19987071  
## 2 Afghanistan  2000 2666   20595360  
## 3 Brazil       1999 37737  172006362 
## 4 Brazil       2000 80488  174504898 
## 5 China        1999 212258 1272915272
## 6 China        2000 213766 1280428583

Acomodo de datos: tidyr

  • unite() une variables en una sola columna.

Acomodo de datos: tidyr

Acomodo de datos: tidyr

  • Veamos unos datos: ¿qué problema tienen?
head(table5)
## # A tibble: 6 × 4
##   country     century year  rate             
##   <chr>       <chr>   <chr> <chr>            
## 1 Afghanistan 19      99    745/19987071     
## 2 Afghanistan 20      00    2666/20595360    
## 3 Brazil      19      99    37737/172006362  
## 4 Brazil      20      00    80488/174504898  
## 5 China       19      99    212258/1272915272
## 6 China       20      00    213766/1280428583

Acomodo de datos: tidyr

  • Los acomodamos o dejamos tidy (ordenados) con:
tidy.5 <- unite(table5, "year", 2:3, sep ="")
tidy.5
## # A tibble: 6 × 3
##   country     year  rate             
##   <chr>       <chr> <chr>            
## 1 Afghanistan 1999  745/19987071     
## 2 Afghanistan 2000  2666/20595360    
## 3 Brazil      1999  37737/172006362  
## 4 Brazil      2000  80488/174504898  
## 5 China       1999  212258/1272915272
## 6 China       2000  213766/1280428583

Acomodo de datos: tidyr

  • extract() divide una variable usando múltiples criterios y genera múltiples columnas.

tidyr: Ejercicios

  • Usa gather() para convertir WorldPhones en un df (data frame) de dos columnas: país y número telefónico.
wphone <- as.data.frame(WorldPhones)
  • Y separa las fechas y une tiempos del siguiente df
weird.times.df <- data.frame(date = as.Date("2017-02-03"),
hour = sample(1:24, 15), min = sample(1:60, 15),
second = sample(1:60,15))

tidyr: Ejercicios

  • Soluciones (1era parte)
    • Disponibles después de la fecha de entrega.

tidyr: Ejercicios

  • Soluciones (2nda parte)
    • Disponibles después de la fecha de entrega.

tidyr: Ejercicios

  • Soluciones (3era parte)
    • Disponibles después de la fecha de entrega.

Acomodo de datos: dplyr

Acomodo de datos: dplyr

  • Un extenso paquete para el manejo de datos y que lleva a R a la era moderna de la ciencia de datos.

  • Nombres de funciones basadas en los verbos de las acciones que llevan a cabo.

  • Uso de parámetros intuitivos y sencillos, cercanos al lenguaje natural.

Acomodo de datos: dplyr

  • Usaremos nycflights13, un df que contiene los 336776 vuelos que salieron de la ciudad de Nueva York en 2013.
install.packages("dplyr")
library(dplyr)
install.packages("nycflights13")
library(nycflights13)

Acomodo de datos: dplyr

-¿Qué contiene flights?

dim(flights)
## [1] 336776     19
head(flights, 4)
## # A tibble: 4 × 19
##    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##   <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
## 1  2013     1     1      517            515         2      830            819
## 2  2013     1     1      533            529         4      850            830
## 3  2013     1     1      542            540         2      923            850
## 4  2013     1     1      544            545        -1     1004           1022
## # … with 11 more variables: arr_delay <dbl>, carrier <chr>, flight <int>,
## #   tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>,
## #   hour <dbl>, minute <dbl>, time_hour <dttm>

Acomodo de datos: dplyr

  • filter() filtra filas utilizando criterios boleanos.

Acomodo de datos: dplyr

  • Podemos listar los criterios para hacer el filtrado después de los datos (flights), separándolos por comas.
f1 <- filter(flights, month == 1, day == 1)
tail(f1)
## # A tibble: 6 × 19
##    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##   <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
## 1  2013     1     1     2353           2359        -6      418            442
## 2  2013     1     1     2356           2359        -3      425            437
## 3  2013     1     1       NA           1630        NA       NA           1815
## 4  2013     1     1       NA           1935        NA       NA           2240
## 5  2013     1     1       NA           1500        NA       NA           1825
## 6  2013     1     1       NA            600        NA       NA            901
## # … with 11 more variables: arr_delay <dbl>, carrier <chr>, flight <int>,
## #   tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>,
## #   hour <dbl>, minute <dbl>, time_hour <dttm>

Acomodo de datos: dplyr

# La manera tradicional de obtener los casos del 1-enero-2013 es:
flights[flights$month == 1 & flights$day == 1, ]

# ¿Qué hace slice()?
slice(flights, 1:10)
# Nota: observa que los datos están ordenados cronológicamente.

# El equivalente tradicional para filtrar las primeras 10 filas sería:
flights[1:10, ]

Acomodo de datos: dplyr

  • arrange() re-arregla el orden de las filas.

Acomodo de datos: dplyr

  • Podemos listar las columnas como criterio para hacer el arreglo, separándolas con coma.
f1 <- arrange(flights, dep_delay, day, month)
head(f1)
## # A tibble: 6 × 19
##    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##   <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
## 1  2013    12     7     2040           2123       -43       40           2352
## 2  2013     2     3     2022           2055       -33     2240           2338
## 3  2013    11    10     1408           1440       -32     1549           1559
## 4  2013     1    11     1900           1930       -30     2233           2243
## 5  2013     1    29     1703           1730       -27     1947           1957
## 6  2013     8     9      729            755       -26     1002            955
## # … with 11 more variables: arr_delay <dbl>, carrier <chr>, flight <int>,
## #   tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>,
## #   hour <dbl>, minute <dbl>, time_hour <dttm>

Acomodo de datos: dplyr

# La manera tradicional
flights[order(flights$year, flights$month, flights$day), ]
flights[order(flights$arr_delay, decreasing=TRUE), ]

# ¿Qué hace desc()?
arrange(flights, desc(arr_delay))

Acomodo de datos: dplyr

  • select() selecciona columnas.

Acomodo de datos: dplyr

  • Podemos listar las columnas a selecionar, separándolas con coma.
f1 <- select(flights, year, month, day)
head(f1)
## # A tibble: 6 × 3
##    year month   day
##   <int> <int> <int>
## 1  2013     1     1
## 2  2013     1     1
## 3  2013     1     1
## 4  2013     1     1
## 5  2013     1     1
## 6  2013     1     1
select(flights, year:day) # desde year hasta day
select(flights, -(year, day)) # todas menos year y day
select(flights, año = year) # podemos cambiar el nombre de la columna al seleccionarla

Acomodo de datos: dplyr

  • distinct() extrae filas únicas.

Acomodo de datos: dplyr

  • Podemos listar una columna para la que deseamos encontrar filas únicas, seleccionándola desde el df flights.
f1 <- distinct(select(flights, tailnum))
head(f1)
## # A tibble: 6 × 1
##   tailnum
##   <chr>  
## 1 N14228 
## 2 N24211 
## 3 N619AA 
## 4 N804JB 
## 5 N668DN 
## 6 N39463

Acomodo de datos: dplyr

  • Podemos listar las columnas para las que deseamos encontrar filas únicas, seleccionándolas y separándolas con coma después del df flights.
f2 <- distinct(select(flights, origin, dest))
head(f2)
## # A tibble: 6 × 2
##   origin dest 
##   <chr>  <chr>
## 1 EWR    IAH  
## 2 LGA    IAH  
## 3 JFK    MIA  
## 4 JFK    BQN  
## 5 LGA    ATL  
## 6 EWR    ORD

Acomodo de datos: dplyr

  • mutate() crea nuevas columnas.

Acomodo de datos: dplyr

  • mutate() crea nuevas columnas.

Acomodo de datos: dplyr

  • Agregamos columnas y especificamos su contenido.
f1 <- mutate(flights, gain = arr_delay - dep_delay,
              speed = gain/air_time * 60)
head(f1)
## # A tibble: 6 × 21
##    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##   <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
## 1  2013     1     1      517            515         2      830            819
## 2  2013     1     1      533            529         4      850            830
## 3  2013     1     1      542            540         2      923            850
## 4  2013     1     1      544            545        -1     1004           1022
## 5  2013     1     1      554            600        -6      812            837
## 6  2013     1     1      554            558        -4      740            728
## # … with 13 more variables: arr_delay <dbl>, carrier <chr>, flight <int>,
## #   tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>,
## #   hour <dbl>, minute <dbl>, time_hour <dttm>, gain <dbl>, speed <dbl>
# ¿Qué hace diferente transmmute()?
transmute(flights, gain = arr_delay - dep_delay,
gain_per_hour = gain/(air_time/60))

Acomodo de datos: dplyr

  • group_by(), ungroup() agrupa/desagrupa las variables según uno o más factores.

Acomodo de datos: dplyr

  • Inidcamos la(s) columna(s) que contiene(n) los factoresque utilizaremos como criterio de agrupación.
f.g <- group_by(flights, tailnum)
head(f.g)
## # A tibble: 6 × 19
## # Groups:   tailnum [6]
##    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##   <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
## 1  2013     1     1      517            515         2      830            819
## 2  2013     1     1      533            529         4      850            830
## 3  2013     1     1      542            540         2      923            850
## 4  2013     1     1      544            545        -1     1004           1022
## 5  2013     1     1      554            600        -6      812            837
## 6  2013     1     1      554            558        -4      740            728
## # … with 11 more variables: arr_delay <dbl>, carrier <chr>, flight <int>,
## #   tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>,
## #   hour <dbl>, minute <dbl>, time_hour <dttm>
# No hay cambios visibles, pero las columnas están agrupadas en el espacio
# de trabajo, podemos usar ungroup() para remover esta agrupación.

Acomodo de datos: dplyr

  • summarise() resume las columas según las variables agrupadas.

Acomodo de datos: dplyr

  • Inidcamos la(s) columna(s) que contiene(n) los factoresque utilizaremos como criterio de agrupación. Y luego hacemos el resumen.
f.g <- group_by(flights, tailnum)
f.sum <- summarise(f.g, n = n(), 
                   mean_delay = mean(dep_delay, na.rm = TRUE))
f.sum
## # A tibble: 4,044 × 3
##    tailnum     n mean_delay
##    <chr>   <int>      <dbl>
##  1 D942DN      4     31.5  
##  2 N0EGMQ    371      8.49 
##  3 N10156    153     17.8  
##  4 N102UW     48      8    
##  5 N103US     46     -3.20 
##  6 N104UW     47      9.94 
##  7 N10575    289     22.7  
##  8 N105UW     45      2.58 
##  9 N107US     41     -0.463
## 10 N108UW     60      4.22 
## # … with 4,034 more rows

Acomodo de datos: dplyr

  • Otras funciones de interés: sample_n() y sample_frac()
sample_n(flights, 10) # muestrea 10 elementos
## # A tibble: 10 × 19
##     year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
##    <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
##  1  2013     5    30      638            625        13      739            745
##  2  2013    10     8      450            500       -10      633            648
##  3  2013    12    13     1527           1530        -3     1808           1829
##  4  2013     9    14     1338           1345        -7     1541           1554
##  5  2013     6    17        8           2245        83      117              1
##  6  2013    11    21     1818           1820        -2     2206           2145
##  7  2013     2    14      825            835       -10     1136           1134
##  8  2013    12    27      925            920         5     1054           1041
##  9  2013     3     9     1955           2000        -5     2230           2300
## 10  2013     9    24     1545           1545         0     1758           1805
## # … with 11 more variables: arr_delay <dbl>, carrier <chr>, flight <int>,
## #   tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>,
## #   hour <dbl>, minute <dbl>, time_hour <dttm>
# Intenta tambien sample_frac(flights, 0.01) para muestrear el 1 %

Acomodo de datos: dplyr

  • Otras funciones de interés: n(), n_distinct(), first(), last() y nth(x, n)
destinations <- group_by(flights, dest)
summarise(destinations, planes = n_distinct(tailnum), flights = n())
## # A tibble: 105 × 3
##    dest  planes flights
##    <chr>  <int>   <int>
##  1 ABQ      108     254
##  2 ACK       58     265
##  3 ALB      172     439
##  4 ANC        6       8
##  5 ATL     1180   17215
##  6 AUS      993    2439
##  7 AVL      159     275
##  8 BDL      186     443
##  9 BGR       46     375
## 10 BHM       45     297
## # … with 95 more rows

Acomodo de datos: dplyr

dplyr: Ejercicios

  • Carga tips
data(tips, package = "reshape2")
head(tips)
##   total_bill  tip    sex smoker day   time size
## 1      16.99 1.01 Female     No Sun Dinner    2
## 2      10.34 1.66   Male     No Sun Dinner    3
## 3      21.01 3.50   Male     No Sun Dinner    3
## 4      23.68 3.31   Male     No Sun Dinner    2
## 5      24.59 3.61 Female     No Sun Dinner    4
## 6      25.29 4.71   Male     No Sun Dinner    4
?tips

dplyr: Ejercicios

  1. Filtra las filas para obtener sólo a los no-fumadores.
  2. Re-arregla el df según la propina en orden descendente.
  3. Selecciona todas las columnas, menos la de fumadores.
  4. Muta una nueva columna para estimar el consumo por persona (total de la cuenta entre número de comensales) .
  5. Resume la propina promedio por día de la semana, hora y sexo.
  • Nota: recuerda nombrar de manera sucesiva cada df resultante.

dplyr: Ejercicios

  • Soluciones (1era parte)
    • Disponibles después de la fecha de entrega.

dplyr: Ejercicios

  • Soluciones (2nda parte)
    • Disponibles después de la fecha de entrega.

dplyr: Ejercicios

  • Soluciones (3era parte)
    • Disponibles después de la fecha de entrega.

dplyr: Ejercicios

  • Soluciones (4ta parte)
    • Disponibles después de la fecha de entrega.

dplyr: Ejercicios

  • Soluciones (5ta parte)
    • Disponibles después de la fecha de entrega.

Acomodo de datos: magrittr

Acomodo de datos: magrittr

  • magrittr introduce el operador “pipeline” (tubo) %>% que sirve para transferir datos entre funciones. Esto resulta en un código más dinámico y fácil de leer que muchas funciones anidadas o consecutivas.

  • Esta forma anidada de expresar una función:

mi.function(mis.datos, arg = valores)
  • Es lo mismo que ésta en formato de “tubo”:
mis.datos %>% mi.function(arg = valores)

Acomodo de datos: magrittr

  • magrittr hace homenaje al pintor surrealista René Magritte. Autor de la serie La traición de las imágenes (1928 - 1929) que incluye Esto no es una pipa.

Acomodo de datos: magrittr

  • magrittr conectamos varias funciones fácilmente.

  • Antes:

w3 <- mutate(w2, day = extract_numeric(day)
w4 <- select(w3, id, year, month, day, element, value) 
w5 <- arrange(w4, id, year, month, day)
  • Después:
library(magrittr)

w3 <- w2 %>% mutate(day = extract_numeric(day)) %>%
select(id, year, month, day, element, value) %>%
arrange(id, year, month, day)

Acomodo de datos: magrittr

Acomodo de datos: magrittr

Acomodo de datos: magrittr

  • Podemos modifcar el df original, producto de las operaciones dentro de la pipa, usando el operador %<>% en vez de del operador flecha <-.
w2 %<>%
mutate(day = extract_numeric(day)) %> %
select(id, year, month, day, element, value) %> %
arrange(id, year, month, day)

magrittr: Ejercicios

  • Reconstruye el siguiente código con tubos.
df1 <- filter(tips, smoker == "No")
df2 <- arrange(df1, tip)
df3 <- select(df2, -smoker)
df4 <- mutate(df3, bill_per_person = total_bill/size)
df5 <- group_by(df4, sex, day, time )
df6 <- summarize(df5, mtip = mean (tip), sdtip = sd(tip))

magrittr: Ejercicios

  • Solución
    • Disponible después de la fecha de entrega.

Acomodo de datos: forcats

Acomodo de datos: forcats

  • Una herramienta para resolver problemas relacionados con factores, como cambiar el orden de los niveles o los niveles mismos.
library(forcats)
data(starwars, package = "dplyr")
?starwars
head(starwars)

Acomodo de datos: forcats

  • fct_infreq() reordena un factor por la frecuencia de sus valores.
starwars %>%
  mutate(eye_color = fct_infreq(eye_color))
## # A tibble: 87 × 14
##    name    height  mass hair_color  skin_color eye_color birth_year sex   gender
##    <chr>    <int> <dbl> <chr>       <chr>      <fct>          <dbl> <chr> <chr> 
##  1 Luke S…    172    77 blond       fair       blue            19   male  mascu…
##  2 C-3PO      167    75 <NA>        gold       yellow         112   none  mascu…
##  3 R2-D2       96    32 <NA>        white, bl… red             33   none  mascu…
##  4 Darth …    202   136 none        white      yellow          41.9 male  mascu…
##  5 Leia O…    150    49 brown       light      brown           19   fema… femin…
##  6 Owen L…    178   120 brown, grey light      blue            52   male  mascu…
##  7 Beru W…    165    75 brown       light      blue            47   fema… femin…
##  8 R5-D4       97    32 <NA>        white, red red             NA   none  mascu…
##  9 Biggs …    183    84 black       light      brown           24   male  mascu…
## 10 Obi-Wa…    182    77 auburn, wh… fair       blue-gray       57   male  mascu…
## # … with 77 more rows, and 5 more variables: homeworld <chr>, species <chr>,
## #   films <list>, vehicles <list>, starships <list>

Acomodo de datos: forcats

  • fct_lump() colapsa los valores menos frecuentes en un factor de “otros”.
starwars %>%
  filter(!is.na(species)) %>%
  mutate(species = fct_lump(species, n = 3)) %>%
  count(species)
## # A tibble: 4 × 2
##   species     n
##   <fct>   <int>
## 1 Droid       6
## 2 Gungan      3
## 3 Human      35
## 4 Other      39

Acomodo de datos: forcats

  • fct_relevel() reordena los niveles de los factores.
swars <- starwars %>% filter(!is.na(gender)) %>% mutate(gender=factor(gender))
levels(swars$gender)
## [1] "feminine"  "masculine"
swars$gender <- fct_relevel(swars$gender, "female", after = 2)
## Warning: Unknown levels in `f`: female
levels(swars$gender)
## [1] "feminine"  "masculine"
swars$gender <- fct_relevel(swars$gender, sort)
levels(swars$gender)
## [1] "feminine"  "masculine"

forcats: Ejercicios

  • Usando el factor, colapsa las categorías hasta que sólo queden N.Amer y Europe.
wphone <- WorldPhones %>% as.data.frame %>% tidyr::gather("Cont","No")
wphone <- as.factor(rep(wphone$Cont, wphone$No))
levels(wphone)
## [1] "Africa"   "Asia"     "Europe"   "Mid.Amer" "N.Amer"   "Oceania"  "S.Amer"

-tip: ?fct_lump y el parámetro prop =

forcats: Ejercicios

  • Solución
    • Disponible después de la fecha de entrega.

Acomodo de datos: tidyverse

  • Otros paquetes del tidyverse

    • Visualización: ggplot2
    • Modelos: modelr, broom
    • Formato: hms, stringr, lubridate, forcats
    • Importar: readr
    • Programación funcional: purrr, tibble

Acomodo de datos: tidyverse

Acomodo de datos: tidyverse

Licencia CC BY